home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / strings / cmprstxt.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-03  |  2.1 KB  |  73 lines

  1. ;void  compress_text(strg,return_strg,del_ch,flag_ch);
  2. ;  unsigned char  *strg,*return_strg,del_ch,flag_ch;
  3.  
  4.     EXTRN  _memory_model:byte
  5.  
  6. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  7.     ASSUME CS:_TEXT
  8.     PUBLIC _compress_text
  9. _compress_text proc near
  10.     push bp            ;
  11.     mov  bp,sp        ;set stack frame
  12.     push di            ;
  13.     push si            ;
  14.     push ds            ;save DS
  15.     cmp  _memory_model,0    ;near or far?
  16.     jle  begin        ;jump if near
  17.     inc  bp            ;else add 2 to BP
  18.     inc  bp            ;
  19. begin:  cmp  _memory_model,2    ;data near or far?
  20.     jb   L0            ;jump if near    
  21.     lds  si,dword ptr[bp+4] ;DS:SI points to source string
  22.     les  di,dword ptr[bp+8] ;ES:DI points to return string
  23.     add  bp,4        ;adjust stack pointer
  24.     jmp  short L00        ;jump ahead
  25. L0:    mov  ax,ds        ;near case
  26.     mov  es,ax        ;
  27.     mov  si,[bp+4]        ;
  28.     mov  di,[bp+6]        ;
  29. L00:    mov  ah,[bp+8]        ;deletion character to AH
  30.     mov  al,ah        ;copy in AL
  31.     mov  dh,[bp+10]        ;flag character to DH
  32.     mov  byte ptr es:[di],0 ;0 return length if error
  33.     cmp  byte ptr[si],0    ;test for null string
  34.     je   L7            ;quit if null
  35. L1:    mov  dl,[si]        ;get char from Strg
  36.     or   dl,dl        ;end of string yet?
  37.     jz   L6            ;quit if so
  38.     cmp  dl,ah        ;a deletion char?
  39.     jne  L4            ;jump ahead if not
  40.     cmp  [si+1],ax        ;next two chars del char?
  41.     jne  L4            ;no deletion if not
  42.     mov  es:[di],dh        ;set flag character
  43.     mov  dl,1        ;DL counts del chars
  44. L2:    inc  si            ;forward Strg ptr
  45.     cmp  [si],al        ;a delete char?
  46.     jne  L3            ;jump ahead if not
  47.     inc  dl            ;count it
  48.     jnz  L2            ;go check next
  49. L3:    dec  si            ;char not found, ptr back
  50.     inc  di            ;forward ret strg ptr
  51.     add  dl,128        ;add 128 to counter
  52.     mov  es:[di],dl        ;place char counter
  53.     jmp  short L5        ;reenter main loop
  54. L4:    mov  es:[di],dl        ;place char in ret strg
  55.     inc  ch            ;inc ret strg counter
  56.     dec  cl            ;dec Strg length counter
  57. L5:    inc  si            ;forward Strg ptr
  58.     inc  di            ;forward return ptr
  59.     jmp  short L1        ;go get next char
  60. L6:    inc  di            ;forward return string ptr
  61.     mov  byte ptr es:[di],0    ;set return strg length
  62. L7:    pop  ds            ;
  63.     pop  si            ;
  64.     pop  di            ;
  65.     pop  bp            ;
  66.     cmp  _memory_model,0    ;quit
  67.     jle  quit        ;
  68.     db   0CBh        ;RET far
  69. quit:    ret            ;RET near
  70. _compress_text ENDP
  71. _TEXT    ENDS
  72.     END
  73.